#ifndef __LOG_H__
#define __LOG_H__
#include <pthread.h>
#include <stdio.h>

// 保护对系统日志写入的互斥锁
extern pthread_mutex_t g_system_log_lock;

// 全局系统日志文件指针
extern FILE *g_system_log_file;

// 默认日志等级
extern int g_log_level;

// 系统日志级别枚举
typedef enum
{
    SYSTEM_LOG_LEVEL_UNKNOWN = 0, // 未设置或无效
    SYSTEM_LOG_LEVEL_DEBUG = 1,   // 调试信息，详细的运行时信息
    SYSTEM_LOG_LEVEL_INFO = 2,    // 普通信息，系统运行状态
    SYSTEM_LOG_LEVEL_WARN = 3,    // 警告信息，可能的问题
    SYSTEM_LOG_LEVEL_ERROR = 4,   // 错误信息，严重问题
    SYSTEM_LOG_LEVEL_FATAL = 5    // 致命错误，系统崩溃前的最后日志
} system_log_level_t;

// 系统错误码枚举
typedef enum
{
    SYSTEM_ERR_OK = 0,                 // 无错误
    SYSTEM_ERR_FILE_NOT_FOUND = -1,    // 文件未找到
    SYSTEM_ERR_PERMISSION_DENIED = -2, // 权限被拒绝
    SYSTEM_ERR_OUT_OF_MEMORY = -3,     // 内存不足
    SYSTEM_ERR_INVALID_ARGUMENT = -4,  // 无效参数
    SYSTEM_ERR_NETWORK_FAILURE = -5,   // 网络故障
    SYSTEM_ERR_NULL_POINTER = -6,      // 空指针异常

    /* 数据库子码：-10 .. -19 */
    SYSTEM_ERR_DB_BASE = -10,    // DB 错误基址（占位）
    SYSTEM_ERR_DB_INIT = -11,    // DB 初始化失败
    SYSTEM_ERR_DB_CONNECT = -12, // DB 连接失败
    SYSTEM_ERR_DB_AUTH = -13,    // DB 认证/凭证失败

    /* 任务队列子码：-20 .. -29 */
    SYSTEM_ERR_QUEUE_BASE = -20,    // 队列错误基址（占位）
    SYSTEM_ERR_QUEUE_EMPTY = -21,   // 队列为空
    SYSTEM_ERR_QUEUE_INVALID = -22, // 队列参数/状态无效

    /* worker/线程子码：-30 .. -39 */
    SYSTEM_ERR_WORKER_BASE = -30,          // worker 错误基址（占位）
    SYSTEM_ERR_WORKER_THREAD_CREATE = -31, // 线程创建失败
    SYSTEM_ERR_WORKER_THREAD_JOIN = -32,   // 线程 join 失败

    /* epoll 子码：-40 .. -49 */
    SYSTEM_ERR_EPOLL_BASE = -40,   // epoll 错误基址（占位）
    SYSTEM_ERR_EPOLL_CREATE = -41, // epoll 创建失败
    SYSTEM_ERR_EPOLL_ADD = -42,    // epoll 添加 fd 失败
    SYSTEM_ERR_EPOLL_DELETE = -43, // epoll 删除 fd 失败

    /* 配置文件子码：-50 .. -59 */
    SYSTEM_ERR_CONFIG_BASE = -50,     // 配置错误基址（占位）
    SYSTEM_ERR_CONFIG_FILE = -51,     // 配置文件打开失败
    SYSTEM_ERR_CONFIG_PARSE = -52,    // 配置解析失败
    SYSTEM_ERR_CONFIG_MISSING = -53,  // 配置缺少必需字段
    SYSTEM_ERR_CONFIG_OVERFLOW = -54, // 配置字段溢出

    /* 会话管理子码: -60 .. -69 */
    SYSTEM_ERR_SESSION_BASE = -60,         // 会话错误基址（占位）
    SYSTEM_ERR_SESSION_NOT_FOUND = -61,    // 会话未找到
    SYSTEM_ERR_SESSION_ALREADY_EXISTS = -62, // 会话已存在

    /* 哈希表子码: -70 .. -79 */
    SYSTEM_ERR_HASHMAP_BASE = -70,            // 哈希表错误基址（占位）
    SYSTEM_ERR_HASHMAP_NOT_FOUND = -71,       // 哈希表未找到指定键
    SYSTEM_ERR_HASHMAP_ALREADY_EXISTS = -72,  // 哈希表键已存在

    /* 令牌子码: -80 .. -89 */
    SYSTEM_ERR_TOKEN_BASE = -80,          // 令牌错误基址（占位）
    SYSTEM_ERR_TOKEN_INVALID = -81,       // 令牌无效
    SYSTEM_ERR_TOKEN_ENCODE_FAILED = -82, // 令牌编码失败
    SYSTEM_ERR_TOKEN_DECODE_FAILED = -83, // 令牌解码失败

    // 日志子码（以 -100 开始，避免与通用错误码冲突）
    SYSTEM_ERR_LOG_BASE = -100,            // 日志错误基址（占位）
    SYSTEM_ERR_LOG_NOT_INITIALIZED = -101, // 日志系统未初始化
    SYSTEM_ERR_LOG_IO = -102,              // 日志写入 I/O 错误
    SYSTEM_ERR_LOG_PATH_INVALID = -103     // 日志路径无效或不可写
} system_error_code_t;

/**
 * @brief 系统日志初始化
 *
 * @param log_file_path 系统日志文件路径
 * @param initial_level 初始日志记录级别
 * @return system_error_code_t 初始化结果状态码
 */
system_error_code_t system_log_init(const char *log_file_path, const system_log_level_t initial_level);

/**
 * @brief 写入系统日志
 *
 * @param level 日志级别
 * @param err_code 相关错误码
 * @param file 源文件名
 * @param func 函数名
 * @param line 行号
 * @param format 格式化字符串（类似printf）
 * @param ... 可变参数
 * @return system_error_code_t 写入结果状态码
 */
system_error_code_t system_log_write(system_log_level_t level, system_error_code_t err_code,
                                     const char *file, const char *func, int line,
                                     const char *format, ...);

// 辅助函数声明（在 systemLog.c 中定义）
int should_show_context(system_log_level_t msg_level);

// 日志等级过滤以及是否输出上下文判断宏
#define LOG_INTERNAL(level, err_code, fmt, ...)                                                      \
    do                                                                                               \
    {                                                                                                \
        if ((level) >= g_log_level)                                                                  \
        {                                                                                            \
            if (should_show_context(level))                                                          \
                system_log_write(level, err_code, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); \
            else                                                                                     \
                system_log_write(level, err_code, NULL, NULL, 0, fmt, ##__VA_ARGS__);                \
        }                                                                                            \
    } while (0)

// 具体级别快捷宏
#define SYSTEM_LOG_DEBUG(err_code, fmt, ...) LOG_INTERNAL(SYSTEM_LOG_LEVEL_DEBUG, err_code, fmt, ##__VA_ARGS__)
#define SYSTEM_LOG_INFO(err_code, fmt, ...) LOG_INTERNAL(SYSTEM_LOG_LEVEL_INFO, err_code, fmt, ##__VA_ARGS__)
#define SYSTEM_LOG_WARN(err_code, fmt, ...) LOG_INTERNAL(SYSTEM_LOG_LEVEL_WARN, err_code, fmt, ##__VA_ARGS__)
#define SYSTEM_LOG_ERROR(err_code, fmt, ...) LOG_INTERNAL(SYSTEM_LOG_LEVEL_ERROR, err_code, fmt, ##__VA_ARGS__)
#define SYSTEM_LOG_FATAL(err_code, fmt, ...) LOG_INTERNAL(SYSTEM_LOG_LEVEL_FATAL, err_code, fmt, ##__VA_ARGS__)

#define LOG_INIT_CHECK(ret)                                            \
    do                                                                 \
    {                                                                  \
        system_error_code_t _ret = (ret);                              \
        if (_ret != SYSTEM_ERR_OK)                                     \
        {                                                              \
            SYSTEM_LOG_ERROR(_ret, "system_log_init failed ret=%d", _ret); \
        }                                                              \
    } while (0)

#endif // __LOG_H__